/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package notes.modele.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import notes.modele.entitiees.Utilisateur;
import static notes.modele.dao.DAOUtilitaire.*;


/**
 *
 * @author florianpf
 */
public class UtilisateurDAOImpl implements UtilisateurDAO{
    
    private DAOFactory  daoFactory;
    
    
    private static final String SQL_SELECT_PAR_EMAIL = "SELECT id_user, nom, prenom, mail, type_user, mot_de_passe, date_inscription FROM utilisateurs WHERE mail = ?";
    private static final String SQL_INSERT = "INSERT INTO utilisateurs (nom, prenom, mail, type_user, mot_de_passe, date_inscription) VALUES (?, ?, ?, ?, ?, NOW())";

    
    
    UtilisateurDAOImpl(DAOFactory daoFactory) {
         this.daoFactory = daoFactory;
    }
    
          /*
 * Simple méthode utilitaire permettant de faire la correspondance (le
 * mapping) entre une ligne issue de la table des utilisateurs (un
 * ResultSet) et un bean Utilisateur.
 */
    private static Utilisateur map( ResultSet resultSet ) throws SQLException {
        Utilisateur utilisateur = new Utilisateur();
        utilisateur.setId( resultSet.getLong("id_user"));
        utilisateur.setEmail( resultSet.getString("mail"));
        utilisateur.setMotDePasse( resultSet.getString("mot_de_passe" ) );
        utilisateur.setNom( resultSet.getString( "nom" ) );
        utilisateur.setPrenom(resultSet.getString("prenom"));
        utilisateur.setDateInscription( resultSet.getTimestamp( "date_inscription" ) );
        
       
        return utilisateur;
    }  


    @Override
    public void creerUtilisateur(Utilisateur utilisateur) throws IllegalArgumentException, DAOException {
        
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true, utilisateur.getNom(), utilisateur.getPrenom(), utilisateur.getEmail(), utilisateur.getType(),  utilisateur.getMotDePasse() );
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'utilisateur, aucune ligne ajoutée dans la table." );
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if ( valeursAutoGenerees.next() ) {
                /* Puis initialisation de la propriété id du bean Utilisateur avec sa valeur */
                utilisateur.setId( valeursAutoGenerees.getLong( 1 ) );
            } else {
                throw new DAOException( "Échec de la création de l'utilisateur en base, aucun ID auto-généré retourné." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
    }

    @Override
     /* Implémentation de la méthode définie dans l'interface UtilisateurDao */
    public Utilisateur trouverUtilisateur(String email) throws DAOException {
        

        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Utilisateur utilisateur = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_EMAIL, false, email );
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            if ( resultSet.next() ) {
                utilisateur = map(resultSet);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }

        return utilisateur;
    }

    @Override
    public void supprimerUtilisateur(String email) throws DAOException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

 
    
}
